<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>

    //1

    //1.执行前  2.执行
    //new的流程：
    //执行前:
    //1.绑定this为空对象
    //2.让空对象 [[Prototype]] -> 函数的prototype属性
    //(1) 所有对象都有 [[Prototype]] (__proto__)
    //   所有的对象，本质都new出来
    //(2) 所有的函数对象 -> prototype

    //3.正常执行函数

    //4.如果函数返回的基本类型, 返回this的值，否则返回原函数的返回值



    //访问对象属性的本质，底层帮你调用函数
    //默认是,
    //[[GET]]
    //1.判断对象里面有没有
    //2.判断他的__proto__指向的对象里面有没有




    //1所有函数都有 prototype
    //2所有对象都有一个 [[Prototype]]
    //所有对象都是new


    //所有的函数对象,都有一个 prototype
    //[GET] [[Prototype]]
    // function Foo() {
    //   this.a = 1;
    //   this.b = 2;
    // }

    // var bar = new Foo();
    // //实例方法，静态方法, this去添加
    // console.log(bar);

    // var a = new Foo();
    // console.log(a.c);


    // var a = new Foo();
    // console.log(a);
    //1.this到空对象

    //二.创建对象的本质
    // var a = { name: 'jack' };
    // var a = new Array();
    // var b = [1, 2, 3]
    // //1.看对象本身有没有这个属性
    // //2.  如果对象本身没有，就去看他的[[Prototype]]
    // console.log(a);



    //三.区分静态方法和实例方法
    //https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array#%E9%9D%99%E6%80%81%E5%B1%9E%E6%80%A7



    //new ?
    // -> new Function()
    //   -> new Object()
    // var a = [1, 2, 3];
    // var a = new Array(1,2,3)
    // 对象的键 -> 字符串
    // console.log(a);
    //a. 变量形式 ->
    // a.age -> a["age"]
      
    // new Array()
    // a = {
    //   "0": 1,
    //   "1": 2,
    //   "2": 3,
    //   length: 3,
    //   __proto__: Array.prototype
    // }

  // new Array(1,2,3)
    // Object.setPrototypeOf(b, {})
    //Array.prototype
    //{}
    // console.log(b instanceof Array);
    // var b = { 0: 1 };
    // Object.setPrototypeOf(b, Array.prototype)
    // console.log(b instanceof Array);

  </script>
</body>

</html>